package MyReaml;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;

import java.util.ArrayList;

public class realmTest extends AuthorizingRealm {
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {

        //获取主用户的用户名字
        String primaryPrincipal = (String)principalCollection.getPrimaryPrincipal();

        //因为该方法要返回AuthorizationInfo对象，所以我们要创建一个simpleAuthorizationInfo对象，在其中实现一些相应的权限授予
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();

        //基于用户的添加权限
        //为该用户添加权限所属用户（通常都是从数据库中查找该用户是否拥有什么权限用户）
        simpleAuthorizationInfo.addRole("admin");

        //添加多个权限，这里就不演示了
        simpleAuthorizationInfo.addRoles(new ArrayList<String>());

        //基于资源的添加权限
        //添加对应操作权限
        simpleAuthorizationInfo.addStringPermission("User:find:user1");   //对User类中的实例user1可用find权限

        simpleAuthorizationInfo.addStringPermission("Teacher:delete:*");  //对Teacher类所有对象都用删除权限

        simpleAuthorizationInfo.addStringPermission("Student:*:*");    //对Student类有任何操作权限

        return simpleAuthorizationInfo;
    }


    /**
     * 在shiro进行校验时，会经过realm接口下的实现类中的doGetAuthenticationInfo方法进行用户名的校验，这里我们写了一个AuthorizingRealm的子类
     * （其中有验证和授权的方法），我们重写验证中的方法（从数据库中获取用户名和密码），然后在这里进行逻辑的判断，如果用户名合法存在，则我们返回
     * 校验信息
     *
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        String principal = (String)authenticationToken.getPrincipal();  //取得令牌中的用户名
        if("lisi".equals(principal)) {
//            1.数据库中的用户名
//            2.数据库中的密码；
//            3.加盐字符串（为加盐可以不写）；
//            4.该类的名字

//            返回校验信息
            return new SimpleAuthenticationInfo(principal,"73f637d490181be56354461cd3928ef5", ByteSource.Util.bytes("ewq"),this.getName());
        }
        return null;

    }
}
